package org.jsola.hr.service;

import org.jsola.core.Page;
import org.jsola.core.service.IService;
import org.jsola.hr.dao.IEmpPositionDAO;
import org.jsola.hr.dto.EmpPositionAddDTO;
import org.jsola.hr.dto.EmpPositionUpdateDTO;
import org.jsola.hr.entity.EmpPositionDO;
import org.jsola.hr.entity.PositionInfoDO;
import org.jsola.hr.query.EmpPositionQuery;
import org.jsola.hr.vo.EmpPaperContractExcelVO;
import org.jsola.hr.vo.EmpPositionListVO;
import org.jsola.hr.vo.EmpPositionVO;
import org.jsola.user.core.TokenUser;
import tk.mybatis.mapper.entity.Example;

import javax.validation.constraints.NotNull;
import java.io.File;
import java.util.List;


/**
 * @author zhr
 */
public interface IEmpPositionService extends IService<IEmpPositionDAO, EmpPositionDO> {

    /**
     * 新增员工岗位关系
     *
     * @param empPositionAddDTO 新增员工岗位关系DTO
     * @param tokenUser         当前用户
     * @return 员工岗位关系详情信息
     */
    EmpPositionVO save(EmpPositionAddDTO empPositionAddDTO, TokenUser tokenUser);

    /**
     * 批量新增员工岗位关系
     *
     * @param empPositionAddDTOList 新增员工岗位关系DTO
     * @param tokenUser             当前用户
     * @return 员工岗位关系详情信息
     */
    List<EmpPositionVO> batchSave(List<EmpPositionAddDTO> empPositionAddDTOList, TokenUser tokenUser);

    /**
     * 修改员工岗位关系
     *
     * @param empPositionUpdateDTO 修改员工岗位关系DTO
     * @param tokenUser            当前用户
     * @return 更新数量
     */
    int update(EmpPositionUpdateDTO empPositionUpdateDTO, TokenUser tokenUser);


    /**
     * 批量删除员工岗位关系，物理删除，更新is_valid字段，从回收站删除
     *
     * @param tokenUser      当前用户
     * @param empPositionIds 员工岗位关系id
     * @return 删除数量
     */
    int deleteByIds(TokenUser tokenUser, String... empPositionIds);

    /**
     * 根据员工岗位关系id查找
     *
     * @param empPositionId 员工岗位关系id
     * @param siteId        所属站点id
     * @return 员工岗位关系详情信息
     */
    EmpPositionVO selectById(String empPositionId, String siteId);

    /**
     * 查询员工岗位关系
     *
     * @param empPositionQuery 查询条件
     * @param siteId           所属站点id
     * @return 员工岗位关系列表信息
     */
    List<EmpPositionListVO> select(EmpPositionQuery empPositionQuery, String siteId);

    /**
     * 查询员工岗位关系记录数
     *
     * @param empPositionQuery 查询条件
     * @param siteId           所属站点id
     * @return 员工岗位关系记录数
     */
    int selectCount(EmpPositionQuery empPositionQuery, String siteId);

    /**
     * 分页查询员工岗位关系
     *
     * @param empPositionQuery 查询条件
     * @param siteId           所属站点id
     * @return 员工岗位关系列表信息
     */
    Page<EmpPositionListVO> selectPage(EmpPositionQuery empPositionQuery, String siteId);


    /**
     * 根据员工岗位关系id查找
     *
     * @param empPositionId 员工岗位关系id
     * @param siteId        所属站点id
     * @return 员工岗位关系
     */
    EmpPositionDO selectDOById(String empPositionId, String siteId);

    /**
     * 查询员工岗位关系
     *
     * @param empPositionQuery 查询条件
     * @param siteId           所属站点id
     * @return 员工岗位关系列表
     */
    List<EmpPositionDO> selectDO(EmpPositionQuery empPositionQuery, String siteId);

    /**
     * 查询员工岗位信息
     *
     * @param example 查询条件
     * @return 员工岗位关系信息
     */
    List<EmpPositionDO> selectByExample(Example example);

    /**
     * 根据公司id删除部门
     *
     * @param companyId 公司id
     * @param tokenUser 当前用户
     */
    void deleteByCompanyId(@NotNull String companyId, TokenUser tokenUser);

    /**
     * 发布员工岗位信息
     *
     * @param empPositionAddList 员工岗位信息
     * @param tokenUser          当前用户
     */
    void publishEmpPositionList(List<EmpPositionAddDTO> empPositionAddList, TokenUser tokenUser);

    /**
     * 查找员工岗位关系
     *
     * @param companyId  公司id
     * @param empId      员工id
     * @param positionId 岗位id
     * @param positionId 站点
     * @return 员工部门关系
     */
    EmpPositionVO selectByEmpAndPosition(String companyId, String empId, String positionId, String siteId);

    /**
     * 根据员工和岗位删除
     *
     * @param companyId  公司id
     * @param empId      员工id
     * @param positionId 岗位id
     * @param tokenUser  当前用户
     */
    void deleteByEmpPosition(String companyId, String empId, String positionId, TokenUser tokenUser);

    /**
     * 保存员工的部门关联
     *
     * @param companyId      公司id
     * @param empId          员工id
     * @param positionIdList 岗位
     * @param tokenUser      当前用户
     */
    void saveEmpPositions(String companyId, String empId, List<String> positionIdList, TokenUser tokenUser);

    /**
     * 查询某个岗位所有的部门与员工关联关系
     *
     * @param companyId   公司id
     * @param positionIds 岗位id
     * @param siteId      站点id
     * @return 某个部门所有的部门与员工关联关系
     */
    List<EmpPositionDO> listAllByPositionId(String companyId, String siteId, String... positionIds);

    /**
     * 公司下所有员工与岗位关系
     *
     * @param companyId 公司id
     * @param siteId    站点
     * @return 员工与岗位关系
     */
    List<EmpPositionDO> listAllByCompany(String companyId, String siteId);

    /**
     * 查询某个员工的所有岗位
     *
     * @param companyId 公司id
     * @param empId     员工id
     * @param siteId    站点id
     * @return 某个员工的所有岗位
     */
    List<EmpPositionDO> listAllByEmpId(String companyId, String empId, String siteId);


    /**
     * 根据员工id列表查询他们所在的岗位
     *
     * @param empIdList 员工id列表
     * @param siteId    站点id
     * @return 岗位
     */
    List<EmpPositionDO> selectByEmpIdList(List<String> empIdList, String siteId);

}


